package com.mz361.modules.system.service.impl;

import com.mz361.common.data.PageSort;
import com.mz361.common.enums.StatusEnum;
import com.mz361.common.utils.EncryptUtil;
import com.mz361.common.utils.RedisUtil;
import com.mz361.common.utils.StringUtil;
import com.mz361.modules.system.domain.CSource;
import com.mz361.modules.system.domain.Company;
import com.mz361.modules.system.domain.Dept;
import com.mz361.modules.system.domain.User;
import com.mz361.modules.system.repository.SourceRepository;
import com.mz361.modules.system.service.CSourceService;
import com.mz361.modules.system.service.CompanyService;
import com.mz361.modules.system.service.DeptService;
import com.mz361.modules.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author liaomch
 * @date 2024/05/07
 */
@Service
public class CSourceServiceImpl implements CSourceService {

    @Autowired
    private SourceRepository sourceRepository;
    @Autowired
    RedisUtil redisUtil;
    @Autowired
    CompanyService companyService;
    @Autowired
    UserService userService;
    @Autowired
    DeptService deptService;

    /**
     * 根据ID查询数据
     *
     * @param id 主键ID
     */
    @Override
    public CSource getById(Long id) {
        return sourceRepository.findById(id).orElse(null);
    }

    @Override
    public CSource getByUserId(Long userId) {
        return sourceRepository.findByUserId(userId);
    }

    @Override
    public CSource getBySourceKey(String key) {
        return sourceRepository.findBySourceKey(key);
    }

    /**
     * 获取分页列表数据
     *
     * @param example 查询实例
     * @return 返回分页数据
     */
    @Override
    public Page<CSource> getPageList(Example<CSource> example) {
        // 创建分页对象
        PageRequest page = PageSort.pageRequest();
        return sourceRepository.findAll(example, page);
    }

    /**
     * 保存数据
     *
     * @param cSource 实体对象
     */
    @Override
    @Transactional
    public CSource save(CSource cSource, Long userId) {
        cSource = sourceRepository.save(cSource);
        //生成sourceKey
        String sourceKey = cSource.getSourceKey();
        String secret_key = cSource.getSecretKey();
        if (StringUtil.isEmpty(sourceKey) || StringUtil.isEmpty(secret_key)) {
            sourceKey = StringUtil.md5(cSource.getId() + cSource.getName() + System.currentTimeMillis());
            secret_key = StringUtil.md516(sourceKey + cSource.getId() + System.currentTimeMillis());
//            将生成的渠道key和密钥保存到缓存中，用于接口api拦截器安全性校验使用
            redisUtil.hSet("SOURCE:SECRET", sourceKey, secret_key);
            cSource.setSecretKey(secret_key);
            cSource.setSourceKey(sourceKey);

            // 创建管理员账户
            User user = new User();
            user.setUsername(cSource.getPhone());
            user.setNickname("mz_" + cSource.getPhone());
            user.setPhone(cSource.getPhone());
            user.setInviteCode(EncryptUtil.getRandomSalt());// 写入邀请码
            String salt = EncryptUtil.getRandomSalt();
            String encrypt = EncryptUtil.encrypt(cSource.getPassword(), salt);
            user.setPassword(encrypt);
            // 将渠道管理员与渠道码建立联系
            user.setSourceKey(sourceKey);
            // 添加渠道默认部门为渠道商
            Dept dept = deptService.getById(6l);
            user.setDept(dept);
            user.setSalt(salt);
            user.setCreateId(userId);//帮定创建账户人关系
            user = userService.save(user);

            cSource.setUserId(user.getId());
            cSource = sourceRepository.save(cSource);
            // 默认创建渠道下一家企业
            Company company = new Company();
            company.setSourceKey(sourceKey);
            company.setCompanyName(cSource.getName());
            company.setCompanyNum(cSource.getCompanyNum());
            company.setCompanyOutId(cSource.getId());
            company.setCreateDate(new Date());
            company.setUpdateDate(new Date());
            company.setCreateBy(user);
            company = companyService.save(company);


        }
        return cSource;
    }

    /**
     * 状态(启用，冻结，删除)/批量状态处理
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateStatus(StatusEnum statusEnum, List<Long> idList) {
        return sourceRepository.updateStatus(statusEnum.getCode(), idList) > 0;
    }


    @Override
    public List<CSource> getSourceList() {
        return sourceRepository.findAll();
    }
}